/**
 * Copyright (c) 2010, Casey Lai
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * 
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation and/or
 * other materials provided with the distribution.
 * 
 * Neither the name of the Cheetah Group nor the names of its contributors may be
 * used to endorse or promote products derived from this software without specific
 * prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 */

package org.cheetahworkflow.designer.tools;

import java.util.ArrayList;
import java.util.List;

import org.cheetahworkflow.designer.Activator;
import org.cheetahworkflow.designer.model.Comment;
import org.cheetahworkflow.designer.model.EndNode;
import org.cheetahworkflow.designer.model.ModuleNode;
import org.cheetahworkflow.designer.model.SequenceNode;
import org.cheetahworkflow.designer.model.StartNode;
import org.cheetahworkflow.designer.model.SwitchNode;
import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import org.eclipse.gef.palette.ConnectionCreationToolEntry;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteGroup;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.SelectionToolEntry;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.gef.requests.SimpleFactory;
import org.eclipse.jface.resource.ImageDescriptor;


public class PaletteFactory {

	public static PaletteRoot createPalette() {
        PaletteRoot paletteRoot = new PaletteRoot();
        paletteRoot.addAll(createCategories(paletteRoot));
        return paletteRoot;
	}
	
	private static List<PaletteContainer> createCategories(PaletteRoot paletteRoot) {
		List<PaletteContainer> categories = new ArrayList<PaletteContainer>();
        categories.add(createControlGroup(paletteRoot));
        categories.add(createComponentsDrawer());
        return categories;
	}
	
	private static PaletteContainer createControlGroup(PaletteRoot root) {
        List<ToolEntry> entries = new ArrayList<ToolEntry>();
        ToolEntry tool = new SelectionToolEntry();
        entries.add(tool);
        root.setDefaultEntry(tool);

        tool = new ConnectionCreationToolEntry("Arrow", "Add an arrow", null,
        		ImageDescriptor.createFromFile(Activator.class, "/icons/arrow.png"),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/arrow.png"));
        entries.add(tool);

        PaletteGroup controlGroup = new PaletteGroup("Control");
        controlGroup.addAll(entries);
        return controlGroup;
	}
	
	private static PaletteContainer createComponentsDrawer() {
        PaletteDrawer drawer = new PaletteDrawer("Components");
        List<ToolEntry> entries = new ArrayList<ToolEntry>();
        
        ToolEntry tool = new CombinedTemplateCreationEntry(" Start",
        		"",
        		StartNode.class,
        		new SimpleFactory(StartNode.class),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/start.png"),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/start.png"));
        entries.add(tool);
        
        tool = new CombinedTemplateCreationEntry(" End",
        		"",
        		EndNode.class,
        		new SimpleFactory(EndNode.class),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/end.png"),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/end.png"));
        entries.add(tool);
        
        tool = new CombinedTemplateCreationEntry(" Sequence Node",
        		"",
        		SequenceNode.class,
        		new SimpleFactory(SequenceNode.class),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/sequence.png"),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/sequence.png"));
        entries.add(tool);
        
        tool = new CombinedTemplateCreationEntry(" Switch Node",
        		"",
        		SwitchNode.class,
        		new SimpleFactory(SwitchNode.class),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/switch.png"),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/switch.png"));
        entries.add(tool);
        
        tool = new CombinedTemplateCreationEntry(" Module",
        		"",
        		ModuleNode.class,
        		new SimpleFactory(ModuleNode.class),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/module.png"),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/module.png"));
        entries.add(tool);
        
        tool = new CombinedTemplateCreationEntry("Comment",
        		"",
        		Comment.class,
        		new SimpleFactory(Comment.class),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/comment.png"),
        		ImageDescriptor.createFromFile(Activator.class, "/icons/comment.png"));
        entries.add(tool);

        drawer.addAll(entries);
        return drawer;
    }
	
}
